//
//  ZYStatusModel.swift
//  CZ29WeiboZYH
//
//  Created by 沐颜澈 on 16/6/27.
//  Copyright © 2016年 muyanche. All rights reserved.
//

import UIKit

class ZYStatusModel: NSObject {
    
    //微博创建的时间
    var created_at:String?
    //微博的ID
    var id: Int64 = 0
    //微博的信息内容
    var text: String? {
        didSet{
            
            textAttr = getWeiboAttr(text ?? "'")
        
        }
    }
    //微博的来源
    var source: String? {
        didSet {
            sourceAttr = getSourceStr(source)
        
        }
    }
    
    //629---------用户信息
    var user:ZYUserModel?
    
    //629 8:39 转发微博
    var retweeted_status:ZYStatusModel?
    
    //配图的数组 630
    var pic_urls:[ZYPictureInfo]?

    //转发数
    var reposts_count:Int = 0 {
        didSet {
            repostsStr = getCountString(reposts_count, title: "转发")
            
            
        }
    }
    //评论数
    var comments_count:Int = 0{
        didSet{
            commentsStr = getCountString(comments_count, title: "评论")
        }
    }

    
    //表态数
    var attitudes_count:Int = 0{
        didSet{
            attitudesStr = getCountString(attitudes_count, title: "赞")
        }
    }
    
    //	int	转发数
    var repostsStr: String?
    //	int	评论数
    var commentsStr: String?
    //	int	表态数
    var attitudesStr: String?
    
    //微博的来源
    //630
    var sourceAttr: NSMutableAttributedString?
    
    //微博的时间7.1
    var createAtStr: String? {
        
        return getWbTimeStr(created_at ?? "")

    }
    
    //微博内容使用的富文本7.7
    var textAttr:NSMutableAttributedString?
    
    //使用KVC构造函数来进行赋值
    init(dict:[String: AnyObject]) {
        super.init()
        setValuesForKeysWithDictionary(dict)
        
    }
    
    override func setValue(value: AnyObject?, forUndefinedKey key: String) {
        
    }
    
    //重写KVC方法
    override func setValue(value: AnyObject?, forKey key: String) {
        if key == "user" {
        //判断可选值是否是存在的,能否字典转模型
            guard let v = value as?[String:AnyObject] else {
                print("可选值可能不存在,或者不能转成字典")
                return
            }
            //如果不能转成字典就需要程序员自己手动的字典转模型
            let u = ZYUserModel(dict: v)
            //对属性进行赋值
            user = u
            
        } else if key == "retweeted_status" {
            guard let v = value as?[String: AnyObject] else {
                print("可选值可能不存在,或者不能转成字典")
                return
            }
            
            let s = ZYStatusModel(dict: v)
            retweeted_status = s
            
        }else if key == "pic_urls"{  // 630-===========
            //判断可选值是否有值是否可以转换数组
            guard let v = value as?[[String: AnyObject]] else {
                return
            }
            
            //创建一个临时数组
            var tempArray: [ZYPictureInfo] = [ZYPictureInfo]()
            //遍历数组
            for dict in v {
                let p = ZYPictureInfo(dict: dict)
                tempArray.append(p)
            
            }
            
            //对pic_urls进行复制
            pic_urls = tempArray
            
            
        
        }else {
            //假如说重写了setValueForKey我还需要系统帮我们通过kvc字典转模型 需要父类
            super.setValue(value, forKey: key)
            
        }
    }
    
    func getCountString(count: Int, title:String) -> String {
    
        if count <= 0 {
            return title
        }else if count > 0 && count < 10000{
            return "\(count)"
        }else {
            let countF = CGFloat(count / 1000)/10
            var countStr = "\(countF)"
            // containsString --》判断字符串是否包含字符串
            if countStr.containsString(".0"){
                countStr = countStr.stringByReplacingOccurrencesOfString(".0", withString: "")
            }
            
            return "\(countStr)万"
        }
        
    }
    
    
    func getSourceStr(source:String?) -> NSMutableAttributedString {
        
        guard let s = source where s.containsString("\">") else {
            let  r = "来自火星的你"
            
            
            return getSourceAttr(r)
            
        }
        
        //字符串的获取
        let start = s.rangeOfString("\">")!
        let end = s.rangeOfString("</a")!
        //字符串的获取
        let result = s.substringWithRange(start.endIndex..<end.startIndex)
        //完成字符串的拼接
        let r = "来自\(result)"
        
        return getSourceAttr(r)
        
    }
    
    //通过字符串来生成一个富文本
    func getSourceAttr(result: String) -> NSMutableAttributedString{
        // 实例化一个富文本
        let attr = NSMutableAttributedString(string: result)
        // 获取range
        let range = (result as NSString).rangeOfString("来自")
        // 设置属性
        attr.addAttributes([NSForegroundColorAttributeName: ThemeColor], range: range)
        return attr
    }
    


}



//7.1
extension ZYStatusModel {

    /*
    - 微博时间业务逻辑需求
    - 如果是今年
    - 如果是今天
    -  如果小于60秒 显示格式: 刚刚
    -  如果 s>=60 && s < 60 * 60  显示格式:xx分钟前
    -  如果 s>= 60*60  显示格式: xx小时前
    - 如果是昨天
    -  2016-06-29 12:12:12  显示格式: 昨天 12:12
    - 如果是其他
    -  2016-06-12 13:13:13  显示格式: 06月12日 13:13
    - 如果不是今年
    - 2015-05-05 10:10:10 显示格式: 2015年05月05日 10:10
    */
    
    func getWbTimeStr(creatAt: String) -> String{
        
        // 时间格式
        let df = NSDateFormatter()
        // 格式
        df.dateFormat = "EEE MMM dd HH:mm:ss z yyyy"
        // 设置地区 （如果在真机上 可能出现时间不对 需要程序员记得设置）
        df.locale = NSLocale(localeIdentifier: "en_US")
        // 微博时间
        let wbDate = df.dateFromString(creatAt)!
        
        // 判断是否是今年
        let isThisYear: Bool = getWbIsThisYear(wbDate)
        
        if isThisYear {
            
            // 日历类
            let calendar =  NSCalendar.currentCalendar()
            // 如果是今天
            if calendar.isDateInToday(wbDate) {
                // 秒数差值
                let s = NSDate().timeIntervalSinceDate(wbDate)
                //如果小于60秒 显示格式: 刚刚
                if s < 60 {
                    return "刚刚"
                }else if s >= 60 && s < 60 * 60 {
                    //显示格式:xx分钟前
                    return "\(Int(s/60))分钟前"
                }else{
                    //显示格式: xx小时前
                    return "\(Int(s/3600))小时前"
                }
                
            }else if calendar.isDateInYesterday(wbDate){
                // 昨天 显示格式: 昨天 12:12
                df.dateFormat = "昨天 HH:mm"
                return df.stringFromDate(wbDate)
            }else {
                // 其他 显示格式: 06月12日 13:13
                df.dateFormat = "MM月dd日 HH:mm"
                return df.stringFromDate(wbDate)
            }
            
            
            
            
        } else {
            
            // 代表不是今年 显示格式: 2015年05月05日 10:10
            df.dateFormat = "yyyy年MM月dd日 HH:mm"
            let result = df.stringFromDate(wbDate)
            return result
            
        }
        
        
    }
    
    
    // 判断微博时间是否是今年
    func getWbIsThisYear(wbDate: NSDate) -> Bool{
        let df = NSDateFormatter()
        // 设置地区 （如果在真机上 可能出现时间不对 需要程序员记得设置）
        df.locale = NSLocale(localeIdentifier: "en_US")
        // 格式
        df.dateFormat = "yyyy"
        // 微博时间
        let wbTimeStr = df.stringFromDate(wbDate)
        // 当前时间
        let currentTimeStr = df.stringFromDate(NSDate())
        // 代表是今年
        if wbTimeStr == currentTimeStr {
            return true
        }else {
            // 代表不是今年
            return false
        }
    }
    
    

}


extension ZYStatusModel {

    func getWeiboAttr(text:String) -> NSMutableAttributedString{
        
        //创建一个富文本
        //把当前text转成了一个富文本
        let resultStr = NSMutableAttributedString(string: text)
        
        //定义一个保存模型的数组
        var matchArray:[ZYMatchResult] = [ZYMatchResult]()
        
        
        
        //正则匹配格式
        //    \\[[a-zA-Z0-9\\u4e00-\\u9fa5]\\]
        // \\[[a-zA-Z0-9\\u4e00-\\u9fa5]+\\]  多个字符的加上一个  +
        
        //通过正则匹配结果
        (text as NSString).enumerateStringsMatchedByRegex("\\[[a-zA-Z0-9\\u4e00-\\u9fa5]+\\]") { (count, string, range, _) -> Void in
            
            // print(string.memory)
            
            //转模型保存数组
            let matchRes = ZYMatchResult(string: (string.memory as! String), range: range.memory)
            matchArray.append(matchRes)
            
            
            
            
        }
        
        
        //遍历,反方向
        for match in matchArray.reverse() {
            
            let emotion = ZYEmotionTools.sharedTools.getSearchEmotion((match.string))
            //需要创建一个富文本传入
            let att = NSTextAttachment()
            //设置image
            let path = emotion?.path ?? ""
            let png = emotion?.png ?? ""
            let name = path + png
            
            //设置image
            att.image = UIImage(named: name, inBundle: ZYEmotionTools.sharedTools.emotionBundle, compatibleWithTraitCollection: nil)
            
            let lineHeight = UIFont.systemFontOfSize(15).lineHeight
            
            
            //设置bounds
            att.bounds = CGRect(x: 0, y: -4, width: lineHeight, height: lineHeight)
            
            let attr = NSAttributedString(attachment: att)
            
            resultStr.replaceCharactersInRange(match.range, withAttributedString: attr)
            
            
            
        }
        
        
        //通过正则分割结果
        //        (text as NSString).enumerateStringsSeparatedByRegex("\\[[a-zA-Z0-9\\u4e00-\\u9fa5]+\\]") { (count, string, range, _) -> Void in
        //            print(string.memory)
        //        }
        
        return resultStr
        
        
    }

    
}


















